home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 287_01 / blkcopy.c < prev    next >
Text File  |  1989-05-23  |  2KB  |  76 lines

  1. #include <stdio.h>
  2. #include <gds.h>
  3.  
  4. #define ERROR (-1)
  5. #define OK 0
  6. #define VOIDBLOCK 1
  7.  
  8. /*==============================================================*
  9.  *  This file contains the following routines:                  *
  10.  *                                                              *
  11.  *==============================================================*/
  12.  
  13. int far *phyaddr();
  14.  
  15. BlockCopy(sframe,sx,sy,dframe,dx,dy,length,height)
  16. int sframe,sx,sy,dframe,dx,dy,length,height;
  17. {
  18.     int curframe, far *sptr, far *dptr, old_x, old_y;
  19.     int far *lcl_sfrmst, lcl_slnbyte, far *lcl_dfrmst, lcl_dlnbyte;
  20.  
  21.     if ((length<=0) || (height <= 0)) return(OK); /* height must be positive */
  22.     sx += ORGX;              /* get absolute position */
  23.     sy += ORGY;
  24.     dx += ORGX;
  25.     dx = (dx & 0xfff0) | (sx & 0x000f);
  26.     dy += ORGY;
  27.  
  28.     curframe=CUR_FRAME;
  29.  
  30.     old_x=sx; old_y=sy;
  31.     if (SelectFrame(sframe)==ERROR) {
  32.         SelectFrame(curframe);
  33.         return(ERROR);
  34.     }
  35.     if (blockclip(&sx,&sy,&length,&height) == VOIDBLOCK) {
  36.         SelectFrame(curframe);
  37.         return(OK);
  38.     }
  39.     dx+=(sx-old_x);
  40.     dy+=(sy-old_y);
  41.     lcl_sfrmst=FRM_ST;
  42.     lcl_slnbyte=LNBYTE;
  43.  
  44.     old_x=dx; old_y=dy;
  45.     if (SelectFrame(dframe)==ERROR) {
  46.         SelectFrame(curframe);
  47.         return(ERROR);
  48.     }
  49.     if (blockclip(&dx,&dy,&length,&height) == VOIDBLOCK) {
  50.         SelectFrame(curframe);
  51.         return(OK);
  52.     }
  53.     sx+=(dx-old_x);
  54.     sy+=(dy-old_y);
  55.     lcl_dfrmst=FRM_ST;
  56.     lcl_dlnbyte=LNBYTE;
  57.  
  58.  
  59.     do {
  60.         FRM_ST=lcl_sfrmst;
  61.         LNBYTE=lcl_slnbyte;
  62.         CUR_FRAME=sframe;
  63.         sptr=phyaddr(sx,sy++);
  64.         FRM_ST=lcl_dfrmst;
  65.         LNBYTE=lcl_dlnbyte;
  66.         CUR_FRAME=dframe;
  67.         dptr=phyaddr(dx,dy++);
  68.         CUR_FRAME=0;    /* always physical address */
  69.         hlcopy(sptr,dptr,sx,length); /* draw a line with height 1 each time */
  70.     } while (--height);
  71.     CUR_FRAME=dframe;
  72.     SelectFrame(curframe);
  73.     return(OK);
  74. }
  75.  
  76.